/*
 * @Date: 2024-11-11 15:37:38
 * @Author: LiSong
 * @LastEditors: LiSong
 * @LastEditTime: 2024-11-14 09:55:10
 * @Description: 下拉数据的数据类型
 */
import { PojoUtils } from '../cfg/PojoUtils'

/**
 * 下拉数据类型类
 */
export class SelectDataType {
  constructor (label, value, order, config) {
    this.label=label
    this.value=value
    this.order=order
    this.config=config
  }

  static get DICT() {
    return new SelectDataType('字典数据', 'dict', 2, {
      // 字典类型: enums-本地枚举 base-基础数据
      dictType: 'enums',
      // 字典名称
      dictName: '',
      // 字典参数
      dictParams: '',
    })
  }
  static get SERVE() {
    return new SelectDataType('动态数据', 'serve', 3, {
      // 请求地址
      url: '',
      // 方法类型
      method: 'post',
      // 请求参数
      params: '',
      // 请求参数类型
      paramsType: 'data'
    })
  }
  static get STATIC() {
    return new SelectDataType('静态数据', 'static', 1, {
      optionItems: []
    })
  }

  /**
   * 比对相同
   * 
   * @param {String|SelectDataType} param 
   * @returns {Boolean} 
   */
  equals (param) {
    if (param instanceof SelectDataType) {
      return param.value === this.value
    } else {
      return param === this.value
    }
  }

  /**
   * 获取数据 
   * 
   * @param {String} type 类型
   * @returns 
   */
  getData (type) {
    return type ? SelectDataType[type.toUpperCase()] : this
  }
}

/**
 * 下拉数据的数据集
 */
export class SelectDataTypes {
  /**
   * 获取集合数据
   * 
   * @returns {Array} 集合数据
   */
  static getData () {
    const staticKeys = PojoUtils.getOwnPropertyStatics(SelectDataType)
    const staticItems = staticKeys.map(key => SelectDataType[key])
    staticItems.sort((a, b) => a.order - b.order)
    return staticItems
  }
}

/**
 * 下拉字段数据的类型
 */
export class SelectDictDataType {
  constructor (label, value, order, field, hidden=false) {
    this.label=label
    this.value=value
    this.order=order
    this.field=field
    this.hidden=hidden
  }

  static get BASE() {
    return new SelectDictDataType('基础数据', 'base', 1, {
      label: 'name', value: 'code'
    })
  }
  static get ENUMS() {
    return new SelectDictDataType('枚举数据', 'enums', 2, {
      label: 'label', value: 'value'
    })
  }
  static get COMMON() {
    return new SelectDictDataType('通用数据', 'common', 2, {
      label: 'label', value: 'value'
    }, true)
  }

  /**
   * 比对相同
   * 
   * @param {String|SelectDictDataType} param 
   * @returns {Boolean} 
   */
  equals (param) {
    if (param instanceof SelectDictDataType) {
      return param.value === this.value
    } else {
      return param === this.value
    }
  }

  /**
   * 获取数据 
   * 
   * @param {String} type 类型
   * @returns 
   */
  getData (type, isTree=false) {
    const dictDataType = type ? SelectDictDataType[type.toUpperCase()] : this
    if (isTree) dictDataType.field['children'] = 'children'
    return dictDataType
  }
}

/**
 * 下拉字段数据的类型数据集
 */
export class SelectDictDataTypes {
  /**
   * 获取集合数据
   * 
   * @returns {Array} 集合数据
   */
  static getData (isTreeSelect=false) {
    const staticKeys = PojoUtils.getOwnPropertyStatics(SelectDictDataType)
    const staticItems = staticKeys.map(key => {
      const item = SelectDictDataType[key]
      if (isTreeSelect) item.field['children'] = 'children'
      return item
    }).filter(item => !item.hidden)
    staticItems.sort((a, b) => a.order - b.order)
    return staticItems
  }
}

